package com.b2c.common.utils;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.dom4j.*;

import java.util.List;

public class XmlUtil {
	/**
	 * xml转json
	 * @param xmlStr
	 * @return
	 * @throws DocumentException
	 */
	public static JSONObject xmlToJson(String xmlStr) throws DocumentException {
		Document doc= DocumentHelper.parseText(xmlStr);
		JSONObject json=new JSONObject();
		dom4jToJson(doc.getRootElement(), json);
		return json;
	}

	/**
	 * xml转json
	 * @param element
	 * @param json
	 */
	public static void dom4jToJson(Element element, JSONObject json){
		//如果是属性
		for(Object o:element.attributes()){
			Attribute attr=(Attribute)o;
			if(!isEmpty(attr.getValue())){
				json.put("@"+attr.getName(), attr.getValue());
			}
		}
		List<Element> chdEl=element.elements();
		if(chdEl.isEmpty()&&!isEmpty(element.getText())){//如果没有子元素,只有一个值
			json.put(element.getName(), element.getText());
		}

		for(Element e:chdEl){//有子元素
			if(!e.elements().isEmpty()){//子元素也有子元素
				JSONObject chdjson=new JSONObject();
				dom4jToJson(e,chdjson);
				Object o=json.get(e.getName());
				if(o!=null){
					JSONArray jsona=null;
					if(o instanceof JSONObject){//如果此元素已存在,则转为jsonArray
						JSONObject jsono=(JSONObject)o;
						json.remove(e.getName());
						jsona=new JSONArray();
						jsona.add(jsono);
						jsona.add(chdjson);
					}
					if(o instanceof JSONArray){
						jsona=(JSONArray)o;
						jsona.add(chdjson);
					}
					json.put(e.getName(), jsona);
				}else{
					if(!chdjson.isEmpty()){
						json.put(e.getName(), chdjson);
					}
				}


			}else{//子元素没有子元素
				for(Object o:element.attributes()){
					Attribute attr=(Attribute)o;
					if(!isEmpty(attr.getValue())){
						json.put("@"+attr.getName(), attr.getValue());
					}
				}
				if(!e.getText().isEmpty()){
					json.put(e.getName(), e.getText());
				}
			}
		}
	}
	public static boolean isEmpty(String str) {

		if (str == null || str.trim().isEmpty() || "null".equals(str)) {
			return true;
		}
		return false;
	}
}
